package com.platform.core.service;

import com.querydsl.core.types.Predicate;
import com.platform.comm.dto.KeyValue;
import com.platform.comm.web.results.TreeNode;
import com.platform.core.entity.SysConfType;
import com.platform.dto.ConfTypeQo;
import com.platform.dto.ConfTypeTreeNode;
import com.platform.dto.CrClassifyDto;
import com.platform.dto.SysConfTypeDto;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.MultiValueMap;

import java.util.List;
import java.util.Map;

/**
 * Description: 参数类型-Service接口
 *
 * @author libin Created on 2019/7/19
 **/
public interface SysConfTypeService extends BaseEntityBiz<SysConfType> {

    /**
     * 创建
     *
     * @param confTypeQo 类别信息
     * @return ConfTypeQo
     */
    ConfTypeQo create(ConfTypeQo confTypeQo);
    /**
     * 获取系统信息
     * @param sys 系统编码-（类别信息中的类别编码）
     * @return 系统相关信息
     */
    Map<String,String> getSystemInitInfo(String sys);

    /**
     * 修改 (编码和名称修改时，会涉及到子节点)
     *
     * @param confTypeQo 类别信息
     * @return ConfTypeQo
     */
    ConfTypeQo modify(ConfTypeQo confTypeQo);

    /**
     * 根据路由物理删除参数类别
     * @param confTypeQo
     */
    void removeByRoute(ConfTypeQo confTypeQo);

    /**
     * 加锁释放锁
     * @param map 锁标识
     */
    SysConfTypeDto lock(Map<String, String> map);

    /**
     * 分页查询
     *
     * @param predicate  查询条件
     * @param pageable   分页参数
     * @param parameters 查询参数
     * @return 列表
     */
    Page<ConfTypeQo> queryConfTypes(Predicate predicate, Pageable pageable, MultiValueMap<String, String> parameters);

    /**
     * 通过路由编码获取详情信息
     * @param typeCode 路由编码
     * @return 配置信息
     */
    ConfTypeQo getDetailByCode(String typeCode);

    /**
     * 通过路由编码获取详情信息
     * @param routeCode 路由编码
     * @return 配置信息
     */
    ConfTypeQo getDetailByRouteCode(String routeCode);

    /**
     *  根据类别编码获取类别名称
     * @param typeCode 类别编码
     * @return 类型名称
     */
    String getNameByCode(String typeCode);


    /**
     *  根据类别编码获取类别名称
     * @param routeCode 类别编码
     * @return 类型名称
     */
    String getNameByRouteCode(String routeCode);

    /**
     * 获取资源信息类目
     *
     * @return 类型名称
     */
    List<SysConfTypeDto> queryResourceCate();

    /**
     * 物理删除
     *
     * @param id 类别Id
     */
    void delete(String id);

    /**
     * 检查类别编码
     *
     * @param id       ID（修改时用）
     * @param typeCode 类别编码
     * @param parentId 父级ID
     * @return long
     */
    long checkTypeCode(String id, String typeCode, String parentId);

    /**
     * 检查类别名称
     *
     * @param id       ID（修改时用）
     * @param typeName 类别编码
     * @param parentId 父级ID
     * @return long
     */
    long checkTypeName(String id, String typeName, String parentId);

    /**
     * 获取树(全加载),非递归方式
     * @param showLevel 展示层级
     * @param showHead 是否展示头节点
     * @param routeCode 路由编码，当前需要展示的节点的routeCode
     * @return List
     */
    List<ConfTypeTreeNode> treeByRouteCodeNotRecursion(String routeCode, boolean showHead, int showLevel);

    /**
     * 获取树(全加载),非递归方式
     *
     * @param showLevel 展示层级
     * @param routeCode 路由编码，当前需要展示的节点的routeCode
     * @return List
     */
    List<ConfTypeQo> treeByLevel(String routeCode, int showLevel);

    /**
     * 获取树(全加载),非递归方式-返回的code是routeCode,供内部调用
     * @param showLevel 展示层级
     * @param showHead 是否展示头节点
     * @param routeCode 路由编码，当前需要展示的节点的routeCode
     * @return List
     */
    List<ConfTypeTreeNode> treeWithRouteCode(String routeCode, boolean showHead, int showLevel);


    List<ConfTypeTreeNode> treeByRouteCodeNotRecursionLowcode(String routeCode,boolean showHead, int showLevel);

    /**
     * 获取模板树
     *
     * @param typeCodes 类别编码
     * @return List
     */
    List<TreeNode> templateTree(String typeCodes);

    /**
     * 根据typeCode查询直接下级
     * 注:只查下一级子集的信息
     *
     * @param typeCodes 编码
     * @return List<Pair < String, String>> 编码:名称
     */
    List<Pair<String, String>> queryDirectSub(String typeCodes);

    /**
     * 根据编码获取当前及子级编码
     *
     * @param typeCode 类别编码
     * @return List
     */
    List<String> queryChildrenTypeCodes(String typeCode);

    /**
     * 根据编码获取当前及子级编码,非递归，使用route进行模糊查询结果
     *
     * @param typeCode 类别编码
     * @return List
     */
    List<String> queryChildrenCodesNotRecursion(String typeCode);

    /**
     * 查询所有的系统类别
     * typeCode只能传顶级目录编码(例如:行业代码(hydm))，否则没有数据
     *
     * @param typeCode 编码
     * @return Map<String, String>
     */
    Map<String, String> queryAllApiCls(String typeCode);

    /**
     * 查询行业代码和行政区划的typeName值,只用作生成excel时使用
     *
     * @param typeCode 编码
     * @return Map<String, String>
     */
    List<String> getHydmAndRegionValue(String typeCode);

    /**
     * 业务元数据来源字典类目
     * @param code
     * @param dictType 1-树类目 2-下拉框类目
     * @return
     */
    List<KeyValue> bizMdFromDict(String code, String dictType);
    /**
     * 获取资源编码与类目映射关系
     * @param codes 类目
     * @return 映射关系
     */
    Map<String, Map<String, String>> getClassifyMapByCode(List<String> codes);

    /**
     * 获取信用档案类目
     * @return  一级 ：二级
     */
    CrClassifyDto getCrClassify();

    /**
     * 根据父级节点查询列表
     * @param routeCode 父节点
     * @return 列表
     */
    List<ConfTypeQo> getListByRouteCodeApi(String routeCode);


    /**
     * 以routeCode开头的所有类目信息
     * @param routeCode 路由编码
     * @return 列表
     */
    List<ConfTypeQo> getListByLikeRouteCodeApi(String routeCode);
}
